﻿using System;
using System.Collections.Generic;

namespace WUDI.ECharts.Series.Sankey
{
	public class Sankey
	{

		public String type { get; set; } = "sankey";

		/// <summary>
		/// string
		/// 组件 ID。默认不指定。指定则可用于在 option 或者 API 中引用组件。
		/// </summary>
		public String id { get; set; }

		/// <summary>
		/// number
		/// 所有图形的 zlevel 值。
		/// zlevel用于 Canvas 分层，不同zlevel值的图形会放置在不同的 Canvas 中，Canvas 分层是一种常见的优化手段。我们可以把一些图形变化频繁（例如有动画）的组件设置成一个单独的zlevel。需要注意的是过多的 Canvas 会引起内存开销的增大，在手机端上需要谨慎使用以防崩溃。
		/// zlevel 大的 Canvas 会放在 zlevel 小的 Canvas 的上面。
		/// </summary>
		public int zlevel { get; set; } = 0;

		/// <summary>
		/// number
		/// 组件的所有图形的z值。控制图形的前后顺序。z值小的图形会被z值大的图形覆盖。
		/// z相比zlevel优先级更低，而且不会创建新的 Canvas。
		/// </summary>
		public int z { get; set; } = 2;

		/// <summary>
		/// string,number
		/// sankey组件离容器左侧的距离。
		/// left 的值可以是像 20 这样的具体像素值，可以是像 '20%' 这样相对于容器高宽的百分比，也可以是 'left', 'center', 'right'。
		/// 如果 left 的值为'left', 'center', 'right'，组件会根据相应的位置自动对齐。
		/// </summary>
		public dynamic left { get; set; } = "5%";

		/// <summary>
		/// string,number
		/// sankey组件离容器上侧的距离。
		/// top 的值可以是像 20 这样的具体像素值，可以是像 '20%' 这样相对于容器高宽的百分比，也可以是 'top', 'middle', 'bottom'。
		/// 如果 top 的值为'top', 'middle', 'bottom'，组件会根据相应的位置自动对齐。
		/// </summary>
		public dynamic top { get; set; } = "5%";

		/// <summary>
		/// string,number
		/// sankey组件离容器右侧的距离。
		/// right 的值可以是像 20 这样的具体像素值，可以是像 '20%' 这样相对于容器高宽的百分比。
		/// </summary>
		public dynamic right { get; set; } = "20%";

		/// <summary>
		/// string,number
		/// sankey组件离容器下侧的距离。
		/// bottom 的值可以是像 20 这样的具体像素值，可以是像 '20%' 这样相对于容器高宽的百分比。
		/// </summary>
		public dynamic bottom { get; set; } = "5%";

		/// <summary>
		/// string,number
		/// sankey组件的宽度。
		/// </summary>
		public dynamic width { get; set; }

		/// <summary>
		/// string,number
		/// sankey组件的高度。
		/// </summary>
		public dynamic height { get; set; }

		/// <summary>
		/// number
		/// 桑基图中每个矩形节点的宽度。
		/// </summary>
		public int nodeWidth { get; set; } = 20;

		/// <summary>
		/// number
		/// 桑基图中每一列任意两个矩形节点之间的间隔。
		/// </summary>
		public int nodeGap { get; set; } = 8;

		/// <summary>
		/// string
		/// 桑基图中节点的对齐方式，默认是双端对齐，可以设置为左对齐或右对齐，对应的值分别是：
		/// justify: 节点双端对齐。
		/// left: 节点左对齐。
		/// right: 节点右对齐。
		/// </summary>
		public SankeyNodeAlign nodeAlign { get; set; } = SankeyNodeAlign.justify;

		/// <summary>
		/// number
		/// 布局的迭代次数，用来不断优化图中节点的位置，以减少节点和边之间的相互遮盖。
		/// 默认布局迭代次数：32。
		/// 经测试，布局迭代次数不要低于默认值。
		/// </summary>
		public int layoutIterations { get; set; } = 32;

		/// <summary>
		/// string
		/// 桑基图中节点的布局方向，可以是水平的从左往右，也可以是垂直的从上往下，对应的参数值分别是 horizontal, vertical。
		/// </summary>
		public String orient { get; set; } = "horizontal";

		/// <summary>
		/// boolean
		/// 控制节点拖拽的交互，默认开启。开启后，用户可以将图中任意节点拖拽到任意位置。若想关闭此交互，只需将值设为 false 就行了。
		/// </summary>
		public Boolean draggable { get; set; } = true;

		/// <summary>
		/// boolean,string
		/// 鼠标 hover 到节点或边上，相邻接的节点和边高亮的交互，默认关闭，可手动开启。
		/// 可选值为：
		/// false：hover 到节点或边时，只有被 hover 的节点或边高亮。
		/// true：同 'allEdges'。
		/// 'allEdges'：hover 到节点时，与节点邻接的所有边以及边对应的节点全部高亮。hover 到边时，边和相邻节点高亮。
		/// 'outEdges'：hover 的节点、节点的出边、出边邻接的另一节点 会被高亮。hover 到边时，边和相邻节点高亮。
		/// 'inEdges'：hover 的节点、节点的入边、入边邻接的另一节点 会被高亮。hover 到边时，边和相邻节点高亮。
		/// </summary>
		public dynamic focusNodeAdjacency { get; set; } = false;

		/// <summary>
		/// Array
		/// 桑基图每一层的设置。可以逐层设置，如下：
		/// levels: [{
		///     depth: 0,
		///     itemStyle: {
		///         color: '#fbb4ae'
		///     },
		///     lineStyle: {
		///         color: 'source',
		///         opacity: 0.6
		///     }
		/// }, {
		///     depth: 1,
		///     itemStyle: {
		///         color: '#b3cde3'
		///     },
		///     lineStyle: {
		///         color: 'source',
		///         opacity: 0.6
		///     }
		/// }]
		/// 也可以只设置某一层：
		/// levels: [{
		///     depth: 3,
		///     itemStyle: {
		///         color: '#fbb4ae'
		///     },
		///     lineStyle: {
		///         color: 'source',
		///         opacity: 0.6
		///     }
		/// }]
		/// </summary>
		public List<object> levels { get; set; }

		/// <summary>
		/// Object
		/// label 描述了每个矩形节点中文本标签的样式。
		/// </summary>
		public WUDI.ECharts.Series.Sankey.Label.Label label { get; set; }

		/// <summary>
		/// Object
		/// 桑基图节点矩形的样式。
		/// </summary>
		public WUDI.ECharts.Series.Sankey.ItemStyle.ItemStyle itemStyle { get; set; }

		/// <summary>
		/// Object
		/// 桑基图边的样式，其中 lineStyle.color 支持设置为'source'或者'target'特殊值，此时边会自动取源节点或目标节点的颜色作为自己的颜色。
		/// </summary>
		public WUDI.ECharts.Series.Sankey.LineStyle.LineStyle lineStyle { get; set; }

		/// <summary>
		/// Object
		/// 桑基图的高亮样式设置。
		/// </summary>
		public WUDI.ECharts.Series.Sankey.Emphasis.Emphasis emphasis { get; set; }

		/// <summary>
		/// Array
		/// 桑基图节点数据列表。
		/// data: [{
		///     name: 'node1',
		///     // This attribute decides the layer of the current node.
		///     depth: 0
		/// }, {
		///     name: 'node2',
		///     depth: 1
		/// }]
		/// 注意: 节点的name不能重复。
		/// </summary>
		public List<object> data { get; set; }

		/// <summary>
		/// Array
		/// 同 data
		/// </summary>
		public List<object> nodes { get; set; }

		/// <summary>
		/// Array
		/// 节点间的边。注意: 桑基图理论上只支持有向无环图（DAG, Directed Acyclic Graph），所以请确保输入的边是无环的. 示例：
		/// links: [{
		///     source: 'n1',
		///     target: 'n2'
		/// }, {
		///     source: 'n2',
		///     target: 'n3'
		/// }]
		/// </summary>
		public List<object> links { get; set; }

		/// <summary>
		/// Array
		/// 同 links
		/// </summary>
		public List<object> edges { get; set; }

		/// <summary>
		/// boolean
		/// 图形是否不响应和触发鼠标事件，默认为 false，即响应和触发鼠标事件。
		/// </summary>
		public Boolean silent { get; set; } = false;

		/// <summary>
		/// boolean
		/// 是否开启动画。
		/// </summary>
		public Boolean animation { get; set; } = true;

		/// <summary>
		/// number
		/// 是否开启动画的阈值，当单个系列显示的图形数量大于这个阈值时会关闭动画。
		/// </summary>
		public int animationThreshold { get; set; } = 2000;

		/// <summary>
		/// number
		/// 初始动画的时长，支持回调函数，可以通过每个数据返回不同的 delay 时间实现更戏剧的初始动画效果：
		/// animationDuration: function (idx) {
		///     // 越往后的数据延迟越大
		///     return idx * 100;
		/// }
		/// </summary>
		public int animationDuration { get; set; } = 1000;

		/// <summary>
		/// string
		/// 初始动画的缓动效果。不同的缓动效果可以参考 缓动示例。
		/// </summary>
		public String animationEasing { get; set; } = "linear";

		/// <summary>
		/// number,Function
		/// 初始动画的延迟，支持回调函数，可以通过每个数据返回不同的 delay 时间实现更戏剧的初始动画效果。
		/// 如下示例：
		/// animationDelay: function (idx) {
		///     // 越往后的数据延迟越大
		///     return idx * 100;
		/// }
		/// 也可以看该示例
		/// </summary>
		public dynamic animationDelay { get; set; } = 0;

		/// <summary>
		/// number,Function
		/// 数据更新动画的时长。
		/// 支持回调函数，可以通过每个数据返回不同的 delay 时间实现更戏剧的更新动画效果：
		/// animationDurationUpdate: function (idx) {
		///     // 越往后的数据延迟越大
		///     return idx * 100;
		/// }
		/// </summary>
		public dynamic animationDurationUpdate { get; set; } = 300;

		/// <summary>
		/// string
		/// 数据更新动画的缓动效果。
		/// </summary>
		public String animationEasingUpdate { get; set; } = "cubicOut";

		/// <summary>
		/// number,Function
		/// 数据更新动画的延迟，支持回调函数，可以通过每个数据返回不同的 delay 时间实现更戏剧的更新动画效果。
		/// 如下示例：
		/// animationDelayUpdate: function (idx) {
		///     // 越往后的数据延迟越大
		///     return idx * 100;
		/// }
		/// 也可以看该示例
		/// </summary>
		public dynamic animationDelayUpdate { get; set; } = 0;

		/// <summary>
		/// *
		/// 本系列特定的 tooltip 设定。
		/// </summary>
		public WUDI.ECharts.Series.Sankey.Tooltip.Tooltip tooltip { get; set; }

	}
}
